package de.dis2011.data;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import de.dis2011.data.DB2ConnectionManager;

public class Mietvertrag extends Vertrag
{
    private Date mietbeginn;
    private int dauer;
    private int nebenkosten;
    private int vermieter;
    private int objekt;

    public Date getMietbeginn()
    {
        return mietbeginn;
    }

    public void setMietbeginn(Date mietbeginn)
    {
        this.mietbeginn = mietbeginn;
    }

    public int getDauer()
    {
        return dauer;
    }

    public void setDauer(int dauer)
    {
        this.dauer = dauer;
    }

    public int getNebenkosten()
    {
        return nebenkosten;
    }

    public void setNebenkosten(int nebenkosten)
    {
        this.nebenkosten = nebenkosten;
    }

    public int getVermieter()
    {
        return vermieter;
    }

    public void setVermieter(int vermieter)
    {
        this.vermieter = vermieter;
    }

    public int getObjekt()
    {
        return objekt;
    }

    public void setObjekt(int objekt)
    {
        this.objekt = objekt;
    }

    /**
     * Lädt einen Vertrag aus der Datenbank
     * 
     * @param id
     *            ID des zu ladenden Vertrags
     * @return Vertrag-Instanz
     */
    public static Mietvertrag load(int id)
    {
        try
        {
            // Hole Verbindung
            Connection con = DB2ConnectionManager.getInstance().getConnection();

            // Erzeuge Anfrage
            String selectSQL = "SELECT * FROM mietvertrag WHERE id = ?";
            PreparedStatement pstmt = con.prepareStatement(selectSQL);
            pstmt.setInt(1, id);

            // Führe Anfrage aus
            ResultSet rs = pstmt.executeQuery();
            if (rs.next())
            {
                Mietvertrag ts = new Mietvertrag();
                ts.setId(id);
                ts.setVertragsnummer(rs.getInt("vertragsnummer"));
                ts.setDatum(rs.getDate("datum"));
                ts.setOrt(rs.getString("ort"));
                ts.setMietbeginn(rs.getDate("mietbeginn"));
                ts.setDauer(rs.getInt("dauer"));
                ts.setNebenkosten(rs.getInt("nebenkosten"));
                ts.setVermieter(rs.getInt("vermieter"));
                ts.setObjekt(rs.getInt("objekt"));

                rs.close();
                pstmt.close();
                return ts;
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Speichert den Vertrag in der Datenbank. Ist noch keine ID vergeben
     * worden, wird die generierte Id von DB2 geholt und dem Model übergeben.
     */
    public void save()
    {
        super.save();
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Achtung, hier wird noch ein Parameter mitgegeben,
            // damit später generierte IDs zurückgeliefert werden!
            String insertSQL = "Insert INTO mietvertrag(id, vertragsnummer, datum, ort, mietbeginn, dauer, nebenkosten, vermieter, objekt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";

            PreparedStatement pstmt = con.prepareStatement(insertSQL, Statement.RETURN_GENERATED_KEYS);

            // Setze Anfrageparameter und führe Anfrage aus
            pstmt.setInt(1, getId());
            pstmt.setInt(2, getVertragsnummer());
            pstmt.setDate(3, (Date) getDatum());
            pstmt.setString(4, getOrt());
            pstmt.setDate(5, getMietbeginn());
            pstmt.setInt(6, getDauer());
            pstmt.setInt(7, getNebenkosten());
            pstmt.setInt(8, getVermieter());
            pstmt.setInt(9, getObjekt());
            pstmt.executeUpdate();

            // Hole die Id des engefügten Datensatzes
            ResultSet rs = pstmt.getGeneratedKeys();
            if (rs.next())
            {
                setId(rs.getInt(1));
            }

            rs.close();
            pstmt.close();

        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void delete()
    {
        super.delete();
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht gelöscht werden");
            }
            else
            {
                String deleteSQL = "DELETE FROM vertrag WHERE id = ?";

                PreparedStatement pstmt = con.prepareStatement(deleteSQL);

                pstmt.setInt(1, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void edit()
    {
        super.edit();
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht geändert werden");
            }
            else
            {
                // Falls schon eine ID vorhanden ist, mache ein Update...
                String updateSQL = "UPDATE mietvertrag SET vertragsnummer = ?, datum = ? ort = ?, mietbeginn = ?, dauer = ?, nebenkosten = ?, vermieter = ?, objekt = ? WHERE id = ?";

                PreparedStatement pstmt = con.prepareStatement(updateSQL);

                // Setze Anfrage Parameter
                pstmt.setInt(1, getVertragsnummer());
                pstmt.setDate(2, (Date) getDatum());
                pstmt.setString(3, getOrt());
                pstmt.setDate(4, getMietbeginn());
                pstmt.setInt(5, getDauer());
                pstmt.setInt(6, getNebenkosten());
                pstmt.setInt(7, getVermieter());
                pstmt.setInt(8, getObjekt());
                pstmt.setInt(9, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
}
